package cn.le.array;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by admin on 2017/6/9.
 */
public class Fruit {}
class Apple extends Fruit{}
class Jonathan extends Apple{}
class Orange extends Fruit{}

class CovariantArrays{

    public static void main(String[] args) {

        Fruit[] fruits = new Apple[10];//这里创建了一个Apple数组,并将其赋值给Fruit引用,这书具有意义的,Apple是Fruit的子类型
        //但是数据的实际类型是Apple,所以只能放入Apple或其子类型,但是对于编译器来说Fruit引用的数组是允许放入Fruit或其子类型,
        //这也是具有意义的,所有编辑器不会报错,在运行时的数据机制知道它是Apple的数组,在数组中放置了异构类型会抛出异常
        fruits[0] = new Apple();
        fruits[1] = new Jonathan();

       // fruits[2] = new Fruit();
       // fruits[3] = new Orange();
    }
}
class NonCovariantGenerics{

    public static void main(String[] args) {
        //Apple的List将持有Apple和其子类型,而Fruit的List将持有任何类型的Fruit,
        //所以Apple的List在类型上不等价于Fruit的List,即使Apple是一种Fruit类型
        //List<Fruit> fruitList = new ArrayList<Apple>();

        List<? extends Fruit> fruits = Arrays.asList(new Apple());

        Apple a = (Apple) fruits.get(0);
        fruits.contains(new Apple());
        fruits.indexOf(new Apple());

        //add()将接受一个泛型参数类型的参数,因此指定一个List<? extends Fruit>时,add()的参数就变成了"? extends Fruit"
        //从这个描述中,编辑器并不能了解这里需要Fruit的哪个子类型,因此她不会接受任何类型的Fruit,
        //编辑器将直接拒绝对参数列表中设计通配符的方法(如add())的调用
       // fruits.add(new Apple());

        List<? super Apple> list = new ArrayList<>();
        list.add(new Apple());
        list.add(new Jonathan());

    }



}

